Surely the users already group these buildings in their mind by something else - by city, by company, by department(within the company). I would suggest that you have an expanding tree or grid that lists the divisions and let the user either check each option, or expand it to check the options within.
So for example, if they think of the buildings by state and city, have a grid that shows the states. They can either check one or more states, or expand any one or more of them. On the ones that they expand, then they would see the cities and they could choose to check or expand any of those cities. On the ones they expand, you'd show the buildings, and here they could check any of the buildings.
Your report would then show everything that was checked. If they checked a state, your report would show every building for that state. If they checked a city, then every building for that city. If they checked a state, and two cities within a different state and three buildings in yet another state and city, then you would show that in your report.
You can use a tree control with checkboxes for this. You can use a TreeView or build a tree like or expanding grid control with a table and buttons. Building your query for the report will take some doing, but once you have done this work, this type of interface will be very intuitive to the user. Do not shy away from something that looks hard to do, if it is the most intuitive solution for the user.
if the user wants to print the report for a single building, then they probably know what state and city (or whatever division they normally think of) and can drill quickly in to find what they want. But you will probably also want to provide a search option that will let them type in a string and you would expand the tree to the matching options and highlight them so they can check them if it/they are what they were looking for. Again, quite a bit of work, but don't shy away from it. The name of the game in providing a user interface is making it INTUITIVE, so the user does not even have to be shown how to use it, but will know exactly what to do as soon as they see the screen.
So yes, what you are thinking of a grid, is good, but give the user some groupings - make it an expandable grid, with rows that are group headers that the user can take advantage of to select everything within that group or expand to drill into that group. The query would then just be a matter of looping through your tree and saying something like "where state is in (...insert state groups that were checked...) or city is in (insert city groups that were checked) or building is in (insert buildings that were checked individually)".
So actually the query should not be hard to build. If you need to pass the collection of what the user chose to other parts of your application, from the code behind of this page, you can build a collection of the selected items and put it in a session variable.