This completely untested, but something like this should work. It assumes that the dates come in before (start and end) – this should have been verified when the data was processed.
$i=1;
$key_start="available_dates_from_";
$key_end = 'available_dates_to_';
echo '<ul>';
while($start = get_post_meta($post_id, $key_start.$i, true)){
$end = get_post_meta($post_id, $key_end.$i, true);
echo '<li> From '.$start. ' until '.$end.'</li>';
$++;
}
echo '</ul>';
This goes through each of the meta keys for that post 'available_dates_from_i'
from i=1
until the key doesn’t exist.
The drawback is that will continue until it first fails to find the appropriate key. So if you delete a pair of dates say, all those after it will not be picked up by this loop, unless you renumber them.
By after I refer to the index appended to the key, not chronologically.
If querying by a date range is not important then you may find it easier to store the ranges as arrays. If it is, it would probably make more sense to store this in your own custom table.