You may use GENERATE_DATE_ARRAY() function to create an array of dates for every start-end dates, then flatten the array with UNNEST() function + CROSS JOIN to merge it back to the original table:
WITH sample_table AS (
SELECT DATE '2020-09-11' as file_date, DATE '2020-09-01' as start_date, DATE '2021-04-30' as end_date, 7 as total_increment UNION ALL
SELECT DATE '2019-12-10' as file_date, DATE '2019-12-01' as start_date, DATE '2020-03-31' as end_date, 3 as total_increment UNION ALL
SELECT DATE '2021-05-08' as file_date, DATE '2021-05-01' as start_date, DATE '2021-07-31' as end_date, 2 as total_increment
)
SELECT file_date, start_date,
LAST_DAY(end_date) as end_date,
date_diff(end_date, start_date, month) as increment
FROM sample_table
CROSS JOIN UNNEST(GENERATE_DATE_ARRAY(start_date, end_date, INTERVAL 1 month)) as end_date
WHERE date_diff(end_date, start_date, month) > 0