1. Manually define the fields in the dataset
2. set up a fake call in the proc to "fool" ssrs. e.g.
select cast('' as varchar(50)) as FirstFieldName,
cast(1 as int) as SecondFieldName,
cast(3.14 as float) as ThirdFieldName,
cast(0 as bit) as FourthFieldName,
... etc. ...
SSRS should do a SchemaOnly call to the proc to discover what is returned. The schema is defined by the first select. In this example, it's a fake since the condition ensures nothing is in fact returned. If that doesn't work, add a default parameter (@schemaonly as bit = 1) to the parameter list and change the where clause to "where 1 = @schemaonly")
The point is to fool ssrs so it sees what it wants.