Despite a straight-set victory, it was a tightly contested match, with Fils failing to convert four set points in the second-set breaker as the American recovered from 6-3 and 7-6 down to power through to the final in Basel.
In a serve-dominated contest, a single break in the first set was all Shelton required as he broke in the eighth game before serving out for a one-set lead.
Both players held serve throughout the second, as a close tiebreak concluded proceedings.
Shelton, ranked No 23, will face the winner of the match between Dane Holger Rune, the No 4 seed, and Frenchman Giovanni Mpetshi Perricard next.
Ahead of his victory, the 22-year-old American won against Argentinian Tomas Martin Etcheverry (6-3, 6-4), Swiss wildcard Stan Wawrinka (7-6 (2), 7-5) and Russian Andrey Rublev, the top seed (7-5, 6-7 (3), 6-4).
Fils, ranked No 20, won against German qualifier Daniel Altmaier (7-6 (5), 6-3), Spaniard Pedro Martinez Portero (7-5, 6-3) and Greek Stefanos Tsitsipas, the No 3 seed (7-6 (5), 6-3) in the previous rounds of the Basel tournament.
Basel ATP 500, other semi-final result (St. Jakobshalle., hard, EUR 2.385.100):
- Holger Rune vs. Giovanni Mpetshi Perricard