I have done this sort of thing with a checkbox. The report displays an initial set of columns and then the user can check (uncheck) the additional columns to be displayed. [This checkbox sits just above the row of column headings.] There is a Dynamic Action for the checkbox which immediately submits -- giving the new view of the report with the "new" set of columns displayed. Each column has a condition such as :F1201_ROLE = 'ADMIN' AND INSTR(:F1201_COLUMN_SELECTOR,'TID') > 0.
In this case, only an ADMIN can see this column and it's only displayed when :F1201_COLUMN_SELECTOR contains "TID". The checkbox places "TID" in the selector global variable when the Ticket ID column is checked. You could use a multi-selector to do the same thing.
Does that help?