To solve this optimization problem, we need to define the decision variables, objective function, and constraints based on the given information.

Let's denote:
- $x_r$ as the number of red shirts produced,
- $x_g$ as the number of green shirts produced.

The objective is to maximize profit. Given that the profit per red shirt is $20 and per green shirt is $35, the total profit can be represented by the equation $20x_r + 35x_g$.

Now, let's formulate the constraints:
1. **Dye Constraint**: Each red shirt requires 2 units of dye, and each green shirt requires 5 units. The company has 1500 units available. So, $2x_r + 5x_g \leq 1500$.
2. **Water Constraint**: Each red shirt needs 5 units of water, and each green shirt needs 8 units. With 3000 units available, we have $5x_r + 8x_g \leq 3000$.
3. **Worker Minutes Constraint**: Red shirts require 20 worker minutes, and green shirts require 25 worker minutes. Given 8000 worker minutes are available, this translates to $20x_r + 25x_g \leq 8000$.

All production quantities must be non-negative, so we also have:
- $x_r \geq 0$
- $x_g \geq 0$

This problem can now be represented as a linear programming optimization problem. We will use Gurobi, a powerful solver for mathematical optimization problems, to find the optimal solution.

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

```python
from gurobipy import *

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

# Define decision variables
x_r = m.addVar(vtype=GRB.CONTINUOUS, name="red_shirts", lb=0)
x_g = m.addVar(vtype=GRB.CONTINUOUS, name="green_shirts", lb=0)

# Objective function: Maximize profit
m.setObjective(20*x_r + 35*x_g, GRB.MAXIMIZE)

# Constraints
m.addConstr(2*x_r + 5*x_g <= 1500, "dye_constraint")
m.addConstr(5*x_r + 8*x_g <= 3000, "water_constraint")
m.addConstr(20*x_r + 25*x_g <= 8000, "worker_minutes_constraint")

# Solve the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: Produce {x_r.x:.2f} red shirts and {x_g.x:.2f} green shirts.")
else:
    print("No optimal solution found")
```