You can take help of from here
Page Block Tables actually support 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
.empty-column-content {
display: none;
}
You can also use this approach. more information can be found here