This is a minor thing, but I tripped over it when skimming your code:
throw2 = (throws.Length == 1) ? 0 : throws;
throw3 = (throws.Length == 3) ? throws : 0;
Why did you invert one of the ternaries? It'd be easier to read if you kept the same structure, e.g.
throw2 = (throws.Length >= 2) ? throws : 0;
throw3 = (throws.Length == ...
Private versus public
public int frame = 0; // The current frame
public int frameScore = 0; // The total of first two throws in a normal frame
public int throws; // Input
public int throw1; // First throw in a frame
public int throw2; // Second throw in a frame
public int throw3; ...
To the many useful points already made I have only a small contribution to add:
public class Test
public static void Main()
BowlingGame newGame = new BowlingGame();
// Test first game - SUCCESS! (190)