OK, so soon after posting I came up with a working solution. With this code I get the price straight from the variation price field, not from the description field as I mentioned in my question.
<?php
$params = array('posts_per_page' => -1, 'post_type' => 'product_variation', 'order' => 'ASC');
$wc_query = new WP_Query($params);
global $product;
?>
<?php if ($wc_query->have_posts()) : ?>
<?php while ($wc_query->have_posts()) : $wc_query->the_post(); ?>
<form class="cart" action="<?php the_permalink() ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="add-to-cart" value="<?php echo esc_attr($product->id); ?>">
<button <?php post_class('button') ?> type="submit"><strong><?php echo implode("", $product->get_variation_attributes()); ?> </strong><span style="display: inline-block"><?php echo $product->get_price(); ?></span></button>
</form>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<div>
<?php _e( 'No Products' ); ?>
</div>
<?php endif; ?>