dynamic...truly dynamic columns in CR don't work.
CR needs / will validate the schema of the data being passed in against the schema of the report. And to be truly dynamic, you would be returning the data from a stored proc (otherwise the values are always there).
So, what's a report writer to do?
My solution, is to return the columns, always named the same, and if the names are dynamic to include the values in the same table or another table, then have CR display the correct title.
with the procedure that fetches the data, you can ensure that every cell is 0 or a value, or you can the report convert NULLs to their default.
Now, onto the grouping issue so that the 50 columns fit on 1 page.
What I think you are after is multiple rows of display to represent 1 row in the data... If you want the data to be displayed as all of columns 1-10 together and then 11-20, and not interleaved, the only idea that comes to mind is subreports. That will give you the information for a 'group' of columns as a distinct set of data.
The way around the subreport would be to break your returning dataset into shorter rows with a code to signify which group of columns it belongs to, then you could display these new shorter records however you want as you can use conditional suppression to hide/display the columns correctly, and since you have grouped them as you want, you can display them as you want.
Hopefully, I am on the right track with my answer.