Leury García added a home run as the AL Central leaders ended their longest skid of the season.
Chicago starter Dylan Cease (6-3) bounced back from rough outing to work 5 2/3 innings, allowing one earned run while striking out seven. He was tagged for seven runs in 3 1/3 innings in his previous outing at Houston.
Liam Hendricks pitched a perfect ninth for his 19th save of the season.
Grandal’s tiebreaking hit came with two outs in the fifth inning and finished Pirates starter Chase De Jong (0-2).
García led off the second with his first home run of the season, a first-pitch drive to right center.
Chicago outfielder Luis González got his first big league hit with a second-inning double and scored on Tim Anderson’s double. González made his first start as the White Sox navigate the absence of outfielder Adam Engel, who was placed on the injured list on Tuesday.
Pittsburgh scored twice in the second after Cease made two errors in attempting to field a bunt by De Jong with Michael Perez on first base. Cease first dropped the ball and then threw it away, giving the Pirates runners at second and third.
Adam Frazier had an RBI grounder and Ke’Bryan Hayes singled home a run that made it 2-all.
Frazier doubled and scored on a single by Hayes in the seventh.
Pirates: LHP Sam Howard has been diagnosed with right knee tendinitis, but is not expected to miss significant time. … RHP Luis Oviedo (left quad strain) is expected to throw a simulated game in St. Louis.
White Sox LHP Carlos Rodon (6-20, 1.83 ERA) is scheduled to start a three-game series with the Mariners in Chicago on Friday. Rodon has allowed just one run in each of his three starts in June and has a 1.42 ERA this month.
Pirates RHP Chad Kuhl (1-4, 5.66) will start a seven-game road swing in St. Louis on Thursday. The Pirates are 0-5 against the Cardinals this season and have lost 10 straight against St. Louis overall.