Caching
There has been some misconceptions as to what virtual mode does. When VirtualMode is set to false, any and all need for ListView item data invokes a ListView.RetrieveVirtualItem Event (this includes repaints). The ListView performs absolutely no caching of ListView item data when VirtualMode is true, it is the responsibility of the application programmer subscribing to the RetrieveVirtualItem event to perform and caching, if needed.
The ListView.CacheVirtualItems event does not imply that the ListView performs caching, it's a hint to the subscriber of the RetreiveVirtualItem that a block of ListView items is about to be requested and perform any caching they see fit. The ListView does not perform the caching.
ListViewItem properties and VirtualMode = true
When VirtualMode is true, ListViewItem's retrieved via properties and methods like the Items property would be created via raising the ListView.RetrieveVirtualItem Event (aka by calling ListView.OnRetrieveVirtualItem()). In pre-release versions of .NET 2.0 (CTPs, Betas), raising some RetrieveVirtualItem events did not connect the ListViewItem object to the ListView object (if the RetrieveVirtualItem event handler didn't) resulting in the ListViewItem being disconnected from the ListView object. Changing ListViewItem properties, therefore, would have no affect--they would not be delegated back to the list view. This is not the case in release versions of .NET 2.0.