To solve this problem, we will first define the decision variables and the objective function. Let's denote the number of fences as `F` and the number of doors as `D`. The profit per fence is $200, and the profit per door is $100. So, the total profit can be represented as `200F + 100D`.

The constraints are based on the availability of materials:
- Each fence requires 2 units of stainless steel, so `F` fences will require `2F` units.
- Each door requires 5 units of stainless steel, so `D` doors will require `5D` units.
- The total available stainless steel is 400 units, leading to the constraint `2F + 5D <= 400`.
- Similarly, for aluminum:
  - Each fence requires 10 units, so `F` fences require `10F` units.
  - Each door requires 1 unit, so `D` doors require `D` units.
  - The total available aluminum is 500 units, leading to the constraint `10F + D <= 500`.
- Additionally, we cannot produce a negative number of fences or doors, so `F >= 0` and `D >= 0`.

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

```python
from gurobipy import *

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

# Define the decision variables
F = m.addVar(name="Number_of_Fences", vtype=GRB.INTEGER, lb=0)
D = m.addVar(name="Number_of_Doors", vtype=GRB.INTEGER, lb=0)

# Define the objective function: Maximize profit
m.setObjective(200*F + 100*D, GRB.MAXIMIZE)

# Add constraints based on material availability
m.addConstr(2*F + 5*D <= 400, name="Stainless_Steel_Constraint")
m.addConstr(10*F + D <= 500, name="Aluminum_Constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {F.varName} = {F.x}, {D.varName} = {D.x}")
    print(f"Maximum Profit: ${m.objVal}")
else:
    print("No optimal solution found")
```