Awesome post! Here is a modification of the solution based on methods Nick Cox discusses in Speaking Stata: Shading zones on time series and other plots.
clear all
import fred UNRATE USRECM, daterange(1990-01-01 .)
keep if UNRATE < .
generate datem = mofd(daten)
tsset datem, monthly
label variable UNRATE "Unemployment Rate"
label variable USRECM "Recession"
** Set y-axis limits and tick interval
local ymin = 0
local ymax = 12
local ystep = 2
** Set time axis limits and tick interval
local tmin 1990m1
local tmax 2020m1
local tstep 60 // every 5 years
** Create bar variable for recession shading
tempvar recessionbar
gen `recessionbar' = `ymax'
lab var `recessionbar' "Recession"
twoway ///
(bar `recessionbar' datem if USRECM==1, base(`ymin') col("217 217 217%60") fi(100) lw(0)) ///
(tsline UNRATE, lc(blue)), ///
yla(`ymin'(`ystep')`ymax') yti("Percent, SA") ///
tlabel(`tmin'(`tstep')`tmax', format(%tmCCYY)) ///
plotr(m(t=0 b=0 l=0)) ysc(noex)