To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. This involves defining variables for the quantities of fences and doors to be made, formulating the objective function that represents the total profit, and listing the constraints based on the available resources.

Let's define:
- $x_1$ as the number of fences to be made,
- $x_2$ as the number of doors to be made.

The objective function, which is the total profit, can be represented as $200x_1 + 100x_2$, since each fence brings a profit of $200 and each door brings a profit of $100.

The constraints are based on the availability of stainless steel and aluminum:
- For stainless steel: $2x_1 + 5x_2 \leq 400$ (since each fence requires 2 units and each door requires 5 units, and there are 400 units available),
- For aluminum: $10x_1 + x_2 \leq 500$ (since each fence requires 10 units and each door requires 1 unit, and there are 500 units available).

Additionally, we have non-negativity constraints because the number of fences and doors cannot be negative:
- $x_1 \geq 0$,
- $x_2 \geq 0$.

Thus, the symbolic representation of the problem is:

```json
{
    'sym_variables': [('x1', 'number of fences'), ('x2', 'number of doors')],
    'objective_function': '200*x1 + 100*x2',
    'constraints': ['2*x1 + 5*x2 <= 400', '10*x1 + x2 <= 500', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's implement this problem in Gurobi using Python:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="fences", lb=0)
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="doors", lb=0)

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

# Add constraints
m.addConstr(2*x1 + 5*x2 <= 400, "stainless_steel_constraint")
m.addConstr(10*x1 + x2 <= 500, "aluminum_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of fences: {x1.x}")
    print(f"Number of doors: {x2.x}")
    print(f"Total profit: ${200*x1.x + 100*x2.x:.2f}")
else:
    print("No optimal solution found.")
```