Because you never actually change out (for a whole new object) the object that your itemA is pointing to in memory, all you end up with is a list of e.g. 100 entries that are all just pointing to the same sole instance of ItemA in memory
In terms you might be more familiar with, your new ItemA()
data is like having a text file on disk somewhere and itemA is a shortcut to it. Calling list.Add(itemA)
(or associating another variable like var itemA2 = itemA
) is merely creating another shortcut to the same file, it is not copying the file to another file.
If you double click your itemA
shortcut to open the file in notepad, edit the contents, save it, close it, then doubleclick itemA2
shortcut then you wouldnt be surprised to see that notepad opens showing a file that has your changes
This is what C# does when you make objects
var myShortcut1 = new RealDataSomewhere();
var myShortcut2 = myShortcut1; //not a copy, another shortcut to the same realdata
var myArrayOfShortcuts = new [] { myShortcut1, myShortcut1, myShortcut1, myShortcut1, myShortcut1}; //every array index is also a shortcut
//at this point there is still only one RealDataSomewhere object in memory and now 7 shortcuts to it
Either clone your itemA before/after you do things to it, adding the clode to the list, or make a new itemA on every pass of the loop. Which of these you actually do depends on what the rest of the code (we can't see) does with itemA
There is a long discussion about cloning here including several handy suggestions for deep cloning,