Hi,
The solution I can propose is to disable all the state zones via the menu System>Zones, and create new state zones, one per city, add them as sub zones of your country, and then change the custom field "state" to "city in south africa" via the menu Display>Custom fields.
That way, your users will be able to select the country and the city for south africa and you'll be able to use these city zones in your shipping methods "zone" restriction options.
Otherwise, it would require a custom made shipping plugin to handle the city restriction. I don't know of any esy way to do that except to have it developed by a skilled PHP developer.