It looks like you need many quotes for a single item. Rather than add columns dynamically, you should look at creating related records dynamically.
For example, if you have a Quotable_Item__c object, it might have a couple properties like name, dimensions, etc. Then you can create an Item_Quote object as such
Quotable_Item__c : the stuff that varies depending on who is selling the service/item.
- Type__c (service or product?)
- Dimensions__c (optional)
- Weight__c (optional)
- Material__c (optional)
- (do NOT add price or quantity here -- those belong in the next object)
Item_Quote__c: contains properties that vary depending on context (who is offering the item at a certain price quote, for example).
- Quoted_Item__c - Lookup field points to Quotable_Item__c.
- Price__c - currency
- Quantity__c - number
- Frequency_Description__c - (text) - for subscription/service type quotes. e.g. 'charged biweekly'.
- Source__c - (string/text) - Name/description of source of the quote.
Then when you are building out a page, show a related list of Quotes. When writing apex code, you can query for all related items with a secondary SELECT statement.
Quotable_Item__c item = [select ... from Quotable_Item__c WHERE ...];
List<Item_Quote> quotes = [SELECT Price__c, Quantity__c, Source__c, Id FROM Price_Quote__c WHERE Quoted_Item__c = :item.Id];
If you have additional random fields whose meaning really can vary widely, you may want to create another field called 'Additional_Data__c' that contains JSON or key-value pairs as text, or another related object with a Key__c and Value__c properties. But I strongly recommend against either of these. In most cases you should only accept data you are prepared to handle in an organized way.
Don't create multiple fields that mean the same thing (Price1, Price2, Price3...) -- this indicates a need for a separate related object.