To solve this optimization problem, we first need to define the variables and parameters involved. Let's denote:

- $x_1$ as the number of cutting boards produced in a week,
- $x_2$ as the number of knife handles produced in a week.

The parameters given are:

- Maximum production capacity for cutting boards: 30 units/week,
- Maximum production capacity for knife handles: 50 units/week,
- Time to produce one cutting board: 5 hours,
- Time to produce one knife handle: 10 hours,
- Profit per cutting board: $100,
- Profit per knife handle: $250,
- Total available labor hours per week: 200 hours.

The objective is to maximize profit, which can be calculated as $100x_1 + 250x_2$.

Now, let's formulate the linear programming problem:

**Objective Function:** Maximize $100x_1 + 250x_2$

**Constraints:**

1. **Cutting Board Production Limit:** $x_1 \leq 30$
2. **Knife Handle Production Limit:** $x_2 \leq 50$
3. **Labor Hours Constraint:** $5x_1 + 10x_2 \leq 200$
4. **Non-Negativity Constraints:** $x_1, x_2 \geq 0$

This formulation ensures that we do not exceed the production limits for either product, nor do we exceed the total available labor hours, while maximizing profit.

Here is how you could implement this in Gurobi using Python:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(lb=0, name="Cutting_Boards")
x2 = m.addVar(lb=0, name="Knife_Handles")

# Set objective function
m.setObjective(100*x1 + 250*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 <= 30, "Max_Cutting_Boards")
m.addConstr(x2 <= 50, "Max_Knife_Handles")
m.addConstr(5*x1 + 10*x2 <= 200, "Labor_Hours")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: x1 = {x1.x}, x2 = {x2.x}")
    print(f"Maximum profit: ${m.objVal}")
else:
    print("No optimal solution found")

```