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 on Tuesday to help the hosts declare on 9-379.
West Indies' first innings was declared at 6-447.
The 33-year-old left-hander 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.
Ballance made 23 Test appearances for England between 2013 and 2017, scoring four centuries.
He has admitted liability for his use of racially discriminatory language in respect of the ongoing inquiry into racism at his former county Yorkshire, and apologised personally to former teammate Azeem Rafiq.