This is tricky, as there a several ways to accomplish this. I would pass a delimited string into the report, from the application and then have the report suppress the columns that don't match (or suppress all columns and only display the ones that match)...but this will leave gaps in the report.
Rather, what I would do is get the data from a stored proc. Name all the columns something generic, like col1...col20. Then in the stored proc, fill the data for these columns correctly based on the delimited string (allowing not only user selected fields, but user selected order) and then display only the fields desired, giving a clean look to the report. The sp will be a monster do accommodate the variable columns, but the end result should look nice. The only hitch is if the aggregate functions used are specific to the column...like you are suppressing some rows, or some fields are always COUNT and others are SUM, this will require more coding.
My hope is to plant a seed of what are some of the options, not give a solution as there isn't a easy one.
HTH