Patrick you misunderstood a lot.
We had always $product->prices and we could only hold ONE price. Now we have $product->allPrices, which is an array, which keeps all prices of the product. To know which price is active, we have now the $product->selectedPrice. But to keep it backward compatible, the $product->prices is set to $product->allPrices[$product->selectedPrice]
$child->prices = $child->allPrices[$child->selectedPrice];But this price is set in getProduct, not in getProductSingle.
The trigger plgVmPrepareCartProduct is very important. In VM2, the cart takes just the form, thats it. For example a product had 3 length variants, you could buy a non existing variant, by manipulating the form. The trigger plgVmPrepareCartProduct checks the values of the form. So plugins can now verify the information/selection given by the user.
And all this was changed from vm2 to vm3.