Firstly, there is no element at index 2, since you did not add three values. There are elements at indexes 0 and 1, but not 2...
Secondly, that is exactly what I would expect: a struct and a class have an important difference: a struct is a value type, a class is a reference type.
You can't write:
things[index].remember = "rememberthis";
because the system will complain:
"Cannot modify the return value of 'System.Collections.Generic.List<complexfilterdemo.frmtester.mydefinition>.this[int]' because it is not a variable"</complexfilterdemo.frmtester.mydefinition>
And that makes sense, because it is a copy of a value type! If you want to "remember" your change, then you need to do this:
MyDefinition md = things[1];
md.remember = "hello";
things[1] = md;
Because when you get or set the value of a value type you are copying the type instance, not getting another reference to the same instance. For proof, try this:
Console.WriteLine("'{0}'", things[1].remember);
MyDefinition md = things[1];
md.remember = "hello";
Console.WriteLine("'{0}':'{1}'", things[1].remember, md.remember);
things[1] = md;
Console.WriteLine("'{0}':'{1}'", things[1].remember, md.remember);
md.remember = "goodbye";
Console.WriteLine("'{0}':'{1}'", things[1].remember, md.remember);
You will get:
''
'':'hello'
'hello':'hello'
'hello':'goodbye'
Which only makes sense if the values are being copied, not referenced.