To solve this optimization problem, we first need to define the decision variables, objective function, and constraints.

Let's denote:
- \(G\) as the number of cups of green tea produced.
- \(B\) as the number of cups of black tea produced.

The objective is to maximize profit. Given that the shop owner makes a profit of $2 on each cup of green tea and $3 on each cup of black tea, the objective function can be written as:
\[ \text{Maximize:} \quad 2G + 3B \]

There are two main constraints:
1. **Time Constraint:** It takes 3 minutes to make a cup of green tea and 5 minutes to make a cup of black tea. The total time available is 560 minutes per week.
\[ 3G + 5B \leq 560 \]

2. **Production Limit Constraint:** The owner can only make 150 cups in total per week.
\[ G + B \leq 150 \]

Additionally, we have non-negativity constraints since the number of cups cannot be negative:
\[ G \geq 0 \]
\[ B \geq 0 \]

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

```python
from gurobipy import *

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

# Define decision variables
G = m.addVar(vtype=GRB.CONTINUOUS, name="Green_Tea", lb=0)
B = m.addVar(vtype=GRB.CONTINUOUS, name="Black_Tea", lb=0)

# Set the objective function
m.setObjective(2*G + 3*B, GRB.MAXIMIZE)

# Add constraints
m.addConstr(3*G + 5*B <= 560, "Time_Constraint")
m.addConstr(G + B <= 150, "Production_Limit")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Green Tea: {G.x}")
    print(f"Black Tea: {B.x}")
    print(f"Total Profit: ${2*G.x + 3*B.x:.2f}")
else:
    print("No optimal solution found")
```
```python
```