You can take help of from [here][1] Page Block Tables actually support <apex:repeat> tags (This was not originally supported). The following example demonstrates 2 ways of accomplishing dynamic columns in a table depending on the type of data you supply. Using fieldsets is the simplest way to control dynamic columns. This is the best choice if displaying a table of SObjects <apex:pageBlock id="block"> <apex:pageBlockTable id="table" var="account" value="{!accounts}"> <apex:column headerValue="Account Name" value="{!account.Name}" /> <apex:repeat var="f" value="{!$ObjectType.Account.FieldSets.Example_Fieldset}"> <apex:column headerValue="{!f.label}"> <apex:inputField value="{!account[f]}" /> </apex:column> </apex:repeat> </apex:pageBlockTable> </apex:pageBlock> If you are using a List, there is an important gotcha with dynamic tables: header cells are not rendered. The fix is to declare the following css snippet and apply the style as outlined below <style type="text/css"> .empty-column-content { display: none; } </style> <apex:pageBlock id="block2"> <apex:pageBlockTable id="table" var="row" value="{!rows}"> <apex:repeat var="cell" value="{!row.cells}"> <apex:column headerValue="No matter how this is defined, it results in an empty cell"> <apex:outputText value="{!cell}" /> </apex:column> </apex:repeat> <!--Define the headers here and hide the empty cells that are created --> <apex:repeat var="header" value="{!headers}"> <apex:column headerValue="{!header}" styleClass="empty-column-content" /> </apex:repeat> </apex:pageBlockTable> </apex:pageBlock> You can also use this approach. more information can be found [here][2] [1]: http://forceguru.blogspot.in/2012/11/page-block-table-with-dynamic-columns.html [2]: http://salesforce.stackexchange.com/a/246/11239