Great feedback. I will take a look at the details.
We are currently running 2020.1 but are looking to upgrade probably by EOY.
FYI - currently the columns to compare is probably very close to your suggestion 2-5.
This is what I ended up doing which seems to work:
Created a Snippet defining the first column…
<table id="product-compare-table" class="table--grid" style="width:100%;">
<thead>
<tr id="product-row" class="heading">
<th class="product-label"></th>
</tr>
</thead>
<tbody>
<tr id="price-row" class="feature">
<td class="feature-label">Electricity Supply Price</td>
</tr>
<tr id="term-row" class="feature">
<td class="feature-label">Fixed Price Protection</td>
</tr>
<tr id="ac-protect-row" class="feature">
<td class="feature-label">A/C Protection</td>
</tr>
<tr id="heat-protect-row" class="feature">
<td class="feature-label">Furnace Protection</td>
</tr>
<tr id="cancel-fee-row" class="feature">
<td class="feature-label">Early Termination Fee</td>
</tr>
</tbody>
</table>
then have Standard Script looping through the Detail table (alternativeOffers) and programmatically adding the columns
var baseTable = loadhtml('snippets/Print/Feature-Table-Base.html');
var hasFeatureHtml = "<td class='checkmark'><b>X</b></td>";
var hasNoFeatureHtml = "<td></td>";
var altOfferCount = record.tables.alternativeOffers.length;
var colProductMax = 3;
var colPercent = (1.0 / altOfferCount) * 75.0;
for(let i = 0; i < altOfferCount; i++)
{
var offer = record.tables.alternativeOffers[i];
var row = query("#product-row", baseTable);
row.append("<th style='width: " + colPercent +"%;'>" + offer.fields.HeaderLabel + "</th>");
row = query("#price-row", baseTable);
row.append("<td>" + formatter.currency(offer.fields.Avg1000Price, "00.0¢ per kWh") + "</td>");
row = query("#term-row", baseTable);
row.append("<td>" + offer.fields.Term + " Months</td>");
row = query("#ac-protect-row", baseTable);
if (offer.fields.HasACProtection) {
row.append(hasFeatureHtml);
}
else {
row.append(hasNoFeatureHtml);
}
row = query("#heat-protect-row", baseTable);
if (offer.fields.HasHeatProtection) {
row.append(hasFeatureHtml);
}
else {
row.append(hasNoFeatureHtml);
}
row = query("#cancel-fee-row", baseTable);
if (offer.fields.AltETP > 0) {
row.append("<td class='fee'>" + formatter.currency(offer.fields.AltETP, "$0") + "</td>");
}
else {
row.append("<td class='fee'>None</td>");
}
}
results.html(baseTable);
Now that the hard work is done, hand it off for someone else to pretty it up
…

Thanks again for the response.