A said you first need to get/create the data for all the rows you need to include in the result set since rows cannot be created from nothing. After that you would have an outer join to join the months to existing rows in your data.
While you can create a table containing the months, another way is to generate date on-the-fly. For example have a look at the following:
Using Table-Valued Functions in SQL Server[
^]
When using TVF as a 'table', your query could look something like:
SELECT ...
FROM GenerateMonths(date1, date2) a
LEFT OUTER JOIN SomeTable b
ON a.SomeColumn = b.SomeColumn
WHERE ...