1. I had this same issue just the other day. The problem was that the invoice I was creating in CMS Desk (still using version 7) is NOT the invoice that is sent to the customer.
The actual invoice that is sent when an order is placed can be found in CMS Site Manager > Administration > Email Templates (not sure where they would be in v8).
There are 6 different templates, one for when an order is placed, one for when the status is changed, one for when payment is received, and each of these have a twin for the admin.
Kentico is VERY misleading about this. I'm not even sure what the invoice you edit in the ecommerce tab is even used for (if it's not sent to the customer and doesn't appear in the checkout process, where is it used and why?).
2 & 3 - It looks like you're basically recreating Kentico's OrderInfo and OrderInfoProvider classes, and I can't see anything custom in the method you've created that the default classes aren't already doing. Have you tried instantiating an OrderInfo object, populating it with the data you need, then passing the isntance as an argument to OrderInfoProvider.SetOrderInfo() ?