To solve this optimization problem, we will first define the decision variables and the objective function. Let's denote the number of canoes as $c$ and the number of paddles as $p$. The profit per canoe is $500, and the profit per paddle is $75. Therefore, the total profit can be represented by the objective function: $500c + 75p$.

The constraints are based on the time available for each operation:
- Each canoe takes 1 hour of cutting, and each paddle takes 0.5 hours of cutting. The total cutting time available is 80 hours.
- Each canoe takes 5 hours of woodworking, and each paddle takes 1 hour of woodworking. The total woodworking time available is 100 hours.
- Each canoe takes 2 hours of sanding, and each paddle takes 0.75 hours of sanding. The total sanding time available is 70 hours.

Thus, we have the following constraints:
1. Cutting: $c + 0.5p \leq 80$
2. Woodworking: $5c + p \leq 100$
3. Sanding: $2c + 0.75p \leq 70$

Since we cannot produce a negative number of canoes or paddles, we also have non-negativity constraints:
$c \geq 0$ and $p \geq 0$.

The goal is to maximize the total profit under these constraints.

Here's how this problem can be translated into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Wood_Shop_Optimization")

# Define decision variables
c = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="canoes")
p = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="paddles")

# Objective function: Maximize profit
m.setObjective(500*c + 75*p, GRB.MAXIMIZE)

# Constraints
m.addConstr(c + 0.5*p <= 80, "cutting_time")
m.addConstr(5*c + p <= 100, "woodworking_time")
m.addConstr(2*c + 0.75*p <= 70, "sanding_time")

# Optimize the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: Canoes = {c.x}, Paddles = {p.x}")
    print(f"Maximum Profit: ${500*c.x + 75*p.x:.2f}")
else:
    print("No optimal solution found")
```