and here is my page:public class piPricingController{
public List<Campaign> listOfOffers {get; set;}
public List<PI_Vendor__c> listOfVendors {get; set;}
public Campaign Offers {get; set;}
public PI_Vendor__c Vendors {get; set;}
public PageReference saveOF(){
UPDATE listOfOffers;
return null;
}
public piPricingController(){
listOfOffers = [Select id, name, (Select id, name, Partner_Name__c, Price_per_Call__c, Charge_Time_Threshold__c, Status__c FROM Vendor_Addenda__r WHERE Vendor_Type__c = 'PI Vendor') FROM Campaign WHERE isActive = TRUE ORDER BY Name ASC];
listOfVendors = [Select id, Name, (Select id, name, Partner_Name__c, Price_per_Call__c, Charge_Time_Threshold__c, Status__c FROM Vendor_Addeda__r WHERE Vendor_Type__c = 'PI Vendor') FROM PI_Vendor__c WHERE Type__c = 'PI Vendor' ORDER BY Name Asc];
}
}
<apex:page controller="piPricingController">
<html>
<table cellpadding="5" style="border-collapse: collapse;table-layout:fixed" border="1">
<tr width="450">
<td width="450"> </td>
<apex:repeat value="{!listOfOffers}" var="a">
<td width="450"> {!a.name}</td>
</apex:repeat>
</tr>
<apex:repeat value="{!listOfVendors}" var="v">
<tr>
<td width="450">{!v.name} </td>
<apex:repeat value="{!listOfOffers}" var="va">
<td width="450">DATA RENDERED IF VENDOR MATCHES VALUE IN COLUMN 1 AND CAMPAIGN MATCHES DATA IN ROW 1 </td>
</apex:repeat>
</tr>
</apex:repeat>
</table>
</html>
</apex:page>

Hi John Neff,Please refer to the below post for similar kind of issue.http://salesforce.stackexchange.com/questions/133412/create-junction-records-through-a-grid-ui-for-two-objects,Hope it helps.Best Regards, Nagendra.P