What this exception is telling you is that you're trying to get something from a slot in the list that is beyond how long the list is. You're asking for the third item (0-based indexing is weird) but there's only two things there.
At the beginning, you have an empty list.
You then add "Hello World!" to it. Lists, by default, add to the back, but in this case, it doesn't really matter. At any rate, you have a list with one item in it: "Hello World!"
Then you do Insert(0, "text3"). This puts the item at spot #0 in the list—the beginning. So you now have a list with "text3" first, then "Hello World!".
You then try to overwrite the item at index 2. Since arrays and lists in C# (and C++, and Java, and a whole lot of other programming languages) use 0-based indexing, the first item is #0. The second is #1. The third is #2. On that line where we say listOfStrings[2] = "hello", we're trying to write into a spot that doesn't exist yet. If instead, you said listOfStrings[1] = "hello", we'd overwrite the last item. (That may or may not be intentional.) Alternatively, if you're really just trying to add the thing to the end of the list, you can just call the Add method, which will do that for you. Incidentally, I think if you called Insert(2, "hello"), I think that would add to the back of the list as well. (But I didn't run it through the compiler, so maybe I'm remembering wrong.)
Does that all make sense?