## Step 1: Define the symbolic representation of the problem
Let's denote the number of hardcover books as $x_1$ and the number of paperback books as $x_2$. The objective is to maximize profit, which is $5x_1 + 2x_2$. The constraints are:
- The total number of books is at most 500: $x_1 + x_2 \leq 500$
- At least 50 books are hardcover: $x_1 \geq 50$
- At least 5 times as many readers prefer paperback books to hardcover books: $x_2 \geq 5x_1$
- Non-negativity constraints: $x_1 \geq 0, x_2 \geq 0$

However, since $x_1$ and $x_2$ represent the number of books, they must be integers, but for the purpose of linear programming, we'll first solve it as if it were a continuous problem and then consider the integrality constraint.

## 2: Convert the problem into a symbolic representation
The symbolic representation can be written as:
```json
{
    'sym_variables': [('x1', 'hardcover books'), ('x2', 'paperback books')],
    'objective_function': '5*x1 + 2*x2',
    'constraints': [
        'x1 + x2 <= 500',
        'x1 >= 50',
        'x2 >= 5*x1',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## 3: Adjust the symbolic representation for practicality
Given that $x_2 \geq 5x_1$ and $x_1 \geq 50$, the constraint $x_1 \geq 0$ is implicitly satisfied. Similarly, since $x_2$ must be at least $5x_1$ and $x_1 + x_2 \leq 500$, we should ensure that our model reflects that both $x_1$ and $x_2$ are non-negative integers.

## 4: Implement the problem in Gurobi
To solve this problem using Gurobi in Python, we'll use the following code:

```python
import gurobi

def solve_bookstore_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    x1 = model.addVar(name="hardcover_books", lb=0, ub=500, vtype=gurobi.GRB.INTEGER)
    x2 = model.addVar(name="paperback_books", lb=0, ub=500, vtype=gurobi.GRB.INTEGER)

    # Objective function: maximize 5*x1 + 2*x2
    model.setObjective(5*x1 + 2*x2, gurobi.GRB.MAXIMIZE)

    # Constraints
    model.addConstr(x1 + x2 <= 500, name="total_books")
    model.addConstr(x1 >= 50, name="min_hardcover")
    model.addConstr(x2 >= 5*x1, name="paperback_preference")

    # Solve the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal solution: hardcover_books = {x1.varValue}, paperback_books = {x2.varValue}")
    else:
        print("The model is infeasible")

solve_bookstore_problem()
```

The above Gurobi code defines the optimization problem as described, with the goal of maximizing profit under the given constraints. It uses Gurobi's Python interface to set up the model, add variables and constraints, and solve the problem. The solution is then printed out, indicating the optimal number of hardcover and paperback books to display and sell.