That's indeed a limitation of the system currently.
What you can do is remove the prices of the main product if not already done and set your prices in the variants.
Then, in the files listing_img_* of the view product that you can edit in the menu Display->Views, you can change the code:
if($this->params->get('add_to_cart')){
to
if($this->params->get('add_to_cart') && !empty($this->row->prices)){
so that the add to cart button will be only displayed when the product has a price.
That work around will avoid to make another query in the database just to check on that case.