Found it!
The createpricediv function is in administrator/components/com_virtuemart/helpers/currencydisplay.php
I changed two lines there and am able to display a zero price (or leave the price blank until custom field prices are chosen).
This line (360) prevents the price div from being created if the price is empty (0 = empty/false):
if(empty($product_price)) return '';
changed to:
//if(empty($product_price)) return '';
@line 387 there is another check for an empty price:
if(!empty($price)){
$vis = "block";
$priceFormatted = $this->priceDisplay($price,0,(float)$quantity,false,$this->_priceConfig[$name][1] );
} else {
$priceFormatted = '';
$vis = "none";
}
I modified this to show the price block in either case:
if(!empty($price)){
$vis = "block";
$priceFormatted = $this->priceDisplay($price,0,(float)$quantity,false,$this->_priceConfig[$name][1] );
} else {
$priceFormatted = '';
$vis = "block";
}
I also experimented with changing the $priceFormatted value to something like $priceFormatted ='$0.00', which worked fine, but since I don't actually need to show the zero price (just the price with the included options), I'm leaving it as is for now.
Seems like it would really be better to check to see whether the product_price is NULL rather than "empty." I think that would allow zero prices to be shown.