When you make your purchase a code is printed on your receipt. You then take that code to the online phone website and get credited for the amount.
It avoids people stealing the cards.
I think the QR code idea would be the most successful one. But how will you be certain the card had not been claimed before you bought it ?
Having the private key in stores makes it way too prone to abuse. The store manager would go to the card rack only to find they've all been scratched off and the coins gone.
A deal between the merchant and company is the way to go, they either have codes corresponding to the bar codes already loaded or they get paid upon sale electronically and are given a code. There's not a lot of up front cost if you don't buy the bitcoins until the actual sale. And it allows for people to buy it at market value at the time of purchase.
A receipt with "You have .12312809 bitcoins waiting for you at bitcard.com/IF3392J29LP"