To solve the optimization problem described, we first need to convert the natural language description into a symbolic representation. This involves defining variables and formulating the objective function and constraints using these variables.

Let's define:
- $x_1$ as the number of keyboards to keep in stock,
- $x_2$ as the number of PC controllers to keep in stock.

The objective is to maximize profit, with each keyboard sold giving a profit of $20 and each PC controller sold giving a profit of $10. Thus, the objective function can be represented as:
\[ \text{Maximize: } 20x_1 + 10x_2 \]

Now, let's consider the constraints:

1. **Floor Space Constraint**: Each keyboard requires 12 sq ft, and each PC controller requires 4 sq ft of floor space. The total available floor space is 200 sq ft.
\[ 12x_1 + 4x_2 \leq 200 \]

2. **PC Controllers Percentage Constraint**: At least 35% of all items in stock must be PC controllers.
\[ x_2 \geq 0.35(x_1 + x_2) \]
This can be rearranged to:
\[ 0.65x_2 \geq 0.35x_1 \]
Or more usefully for our purposes:
\[ 0.35x_1 \leq 0.65x_2 \]

3. **Capital Constraint**: Each keyboard ties up $200 in capital, and each PC controller ties up $150. The maximum capital to be tied up is $5,000.
\[ 200x_1 + 150x_2 \leq 5000 \]

4. **Non-Negativity Constraints**: Since we cannot have negative quantities of items:
\[ x_1 \geq 0 \]
\[ x_2 \geq 0 \]

Given this symbolic representation, the problem in JSON format is:

```json
{
    'sym_variables': [('x1', 'keyboards'), ('x2', 'PC controllers')],
    'objective_function': '20*x1 + 10*x2',
    'constraints': [
        '12*x1 + 4*x2 <= 200',
        '0.35*x1 <= 0.65*x2',
        '200*x1 + 150*x2 <= 5000',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

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

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(vtype=GRB.CONTINUOUS, name="keyboards")
x2 = m.addVar(vtype=GRB.CONTINUOUS, name="PC_controllers")

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

# Add constraints
m.addConstr(12*x1 + 4*x2 <= 200, "floor_space")
m.addConstr(0.35*x1 <= 0.65*x2, "pc_controller_percentage")
m.addConstr(200*x1 + 150*x2 <= 5000, "capital")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Keyboards: {x1.x}")
    print(f"PC Controllers: {x2.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```