The 23-year-old, ranked world number five, had to dig deep on his serve, saving nine of the 11 break points he faced.
It was Shelton's sixth career title and his third this season, following wins in Dallas and Munich.
"It means a lot to me," Shelton said. "Certainly a difficult week, not an easy week to get through. I'm pretty exhausted, but to play the way I did against the quality of opponents I played in very tight matches and getting a win today against one of the best grass-court players in the world is a huge boost."
The only other player to have won three titles this season is Italian world number one Jannik Sinner.
