Crystal doesn't do dynamic reporting.
With that said, you can get the appearance of dynamic reporting, but it is going to be limited as Crystal doesn't do dynamic reporting. (just can't say it enough, crystal reads data from a known format and displays it in a template. both the data structure and template need to be 'known' at design time...so not dynamic)
How do you get around this. Since stored procs are out of the question (they too are not dynamic), I would use the middle layer to create an XML dataset with set columns for the data. You can then pass any type of info from as many tables as desired as long as the information is stored in the predefined data column. Since Datasets can have multiple tables, you can have a second table with what the columns are called, and have Crystal read the column names and display them. It appears dynamic, but isn't. where it gets tricky is if some of the columns are numeric and you want aggregate functions performed on them. Again the second table can store this information and you can create formulas to respond this in Crystal.
You can set the dataset to the crystal reports dataset or data binding...I don't remember at the moment as mine is in an inherited class and all I need to do is call a property, which sets the dataset and displays the report.
Just remember, you need to pass the same data structure to the report all the time. You can have extra fields, but you can never skimp on the fields that are actually used in the report (a check mark is displayed for used fields) because if Crystal doesn't see the fields, it will throw an error.
Hope this guides you to the final report, as you can see, your request is way too complex to be answered here.