grid[i][j] = ((rand() % 4) == 0) ? '@': '#'; // choose @ or #
'$'; // do nothing
'%'; // do nothing
... is selecting from the two possible choices.
Remember, the ? operator in this syntax is simply a concise way to write an if/else statement, that's why it gives an either/or choice.
Instead I'd suggest something like this:
1 2 3 4 5 6 7 8 9 10
char fill[] = "@#$%"; // list of possible characters
int len = strlen(fill); // count how many characters
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
grid[i][j] = fill[rand() % len]; // choose one of characters
}
}