This took some time. The gutterIndex is a static char array that keeps track of when a gutter ball has been rolled. You can use StringBuilder for improved performance but I think this was easier to control the char array for detecting when the user rolled a gutter ball.
public static string FormatRolls(List<int> rolls)
{
string output = string.Empty;
for (int i = 0; i < rolls.Count; i++)
{
if (i <= 20)
{
if (rolls[i] == 0)
{
output += rolls[i].ToString();
if (i == (rolls.Count - 1))
{
gutterIndex[i] = 'g';
}
}
else if (i > 0 && rolls[i - 1] < 10 && rolls[i] < 10 && (rolls[i - 1] + rolls[i] == 10))
{
output += "/";
}
else if (rolls[i] == 10)
{
if (i > 0 && i <= rolls.Count - 1)
{
if (rolls[i - 1] > 0 && rolls[i - 1] != 10)
{
output += "/";
}
else if (gutterIndex.Length > i)
{
output += (gutterIndex[i - 1] == 'g') ? "/" : "X";
}
else
output += "X";
}
else
output += "X";
}
else
{
output += rolls[i].ToString();
}
}
}
return output;
}