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

Given:
- Variables: hours worked by Bobby (x1), hours worked by Hank (x2)
- Objective Function: Maximize 2*x1 + 9*x2
- Constraints:
  1. Organization score constraint for Bobby: x1 * 6 >= part of the total organization score requirement.
  2. Organization score constraint for Hank: x2 * 5 >= part of the total organization score requirement.
  3. Total combined organization score from hours worked by both must be at least 14: 6*x1 + 5*x2 >= 14
  4. Linear inequality constraint: 10*x1 - 9*x2 >= 0
  5. Upper bound on total combined organization score: 6*x1 + 5*x2 <= 39

Symbolic Representation:
```json
{
  'sym_variables': [('x1', 'hours worked by Bobby'), ('x2', 'hours worked by Hank')],
  'objective_function': 'Maximize 2*x1 + 9*x2',
  'constraints': [
    '6*x1 + 5*x2 >= 14', 
    '10*x1 - 9*x2 >= 0', 
    '6*x1 + 5*x2 <= 39'
  ]
}
```

Now, let's implement the solution using Gurobi in Python:

```python
from gurobipy import *

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

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

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

# Add constraints
m.addConstr(6*x1 + 5*x2 >= 14, "Total_Organization_Score_Min")
m.addConstr(10*x1 - 9*x2 >= 0, "Linear_Inequality_Constraint")
m.addConstr(6*x1 + 5*x2 <= 39, "Upper_Bound_Total_Organization_Score")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Hours worked by Bobby: {x1.x}")
    print(f"Hours worked by Hank: {x2.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```