Starter Dallas Keuchel allowed two runs on six hits with eight strikeouts and two walks in six innings for the Sox, who took two of three in the series.
Yermín Mercedes — batting second in the lineup for the first time — doubled and scored on a double by José Abreu. Grandal followed with a two-run homer.
Marcus Semien knocked in a run with a single in the fifth, cutting the Sox lead to 3-1. The Blue Jays had runners on the corners with two outs when Keuchel struck out Bo Bichette to limit the damage.
Keuchel got what had the makings of an inning-ending double play in the sixth when Randal Grichuk hit a grounder to third with a runner on first and one out.