To solve this linear programming optimization problem, we need to define the decision variables, the objective function, and the constraints.

Let's denote:
- $x$ as the number of dining tables made.
- $y$ as the number of desks made.

The objective is to maximize profit. Given that each dining table yields a profit of $350 and each desk yields a profit of $400, the objective function can be written as:
\[ \text{Maximize:} \quad 350x + 400y \]

Now, let's define the constraints based on the available resources:

1. **Woodworking hours constraint**: Each dining table requires 2 hours of woodworking, and each desk requires 3 hours. There are 100 hours available.
\[ 2x + 3y \leq 100 \]

2. **Nails constraint**: Each dining table requires 3 boxes of nails, and each desk requires 4 boxes. There are 75 boxes available.
\[ 3x + 4y \leq 75 \]

3. **Varnish constraint**: Each dining table requires 1 unit of varnish, and each desk requires 2 units. There are 80 units available.
\[ x + 2y \leq 80 \]

Additionally, we have non-negativity constraints since the number of tables and desks cannot be negative:
\[ x \geq 0 \]
\[ y \geq 0 \]

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Woodshop_Optimization")

# Define the decision variables
x = m.addVar(name="dining_tables", vtype=GRB.CONTINUOUS, lb=0)
y = m.addVar(name="desks", vtype=GRB.CONTINUOUS, lb=0)

# Define the objective function
m.setObjective(350*x + 400*y, GRB.MAXIMIZE)

# Define the constraints
m.addConstr(2*x + 3*y <= 100, name="woodworking_hours")
m.addConstr(3*x + 4*y <= 75, name="nails")
m.addConstr(x + 2*y <= 80, name="varnish")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found.")
    print(f"Number of dining tables: {x.x}")
    print(f"Number of desks: {y.x}")
    print(f"Maximum profit: ${350*x.x + 400*y.x:.2f}")
else:
    print("No optimal solution found. The model is either infeasible or unbounded.")
```