He becomes only the second batsman, after former South Africa and Australia opener Kepler Wessels, to have scored Test centuries for two countries.
Ballance, who switched allegiance last year and has already played for Zimbabwe in ODIs this year, scored 137 at the Queens Sports Club to help the hosts declare on 9-379.
West Indies' first innings was declared at 6-447. Batting again they were 21 without loss at the close on the fourth day on Tuesday, giving them an 89-run lead.
With one day remaining a draw appears inevitable. The second match in the two-Test series begins on 12 February.
Left-hander Ballance brought up his ton with a six over deep square leg as he and Brandon Mavuta put together a 135-run partnership for the eighth wicket, hauling Zimbabwe out of trouble after they had slumped to 6-147, then 7-192.
The 25-year-old Mavuta, who claimed a maiden five-wicket haul on the first two days of rain-affected play, made 56 before being bowled by Jason Holder on a flat deck.
Earlier opener Innocent Kaia made 67.
West Indies used nine bowlers with Alzarri Joseph (3-75) and Holder (2-55) the most successful.
Harare-born Ballance, who moved to England as a schoolboy, was able to switch allegiances under International Cricket Council rules as a player can change between two different full member nations after a three-year stand-down period.
The 33-year-old made 23 Test appearances for England between 2013 and 2017, scoring four centuries.