Choose a single hostname for CloudFront to use as the origin server hostname when accessing the back-end. This hostname needs to be in a domain that you control, a domain is provisioned in Route 53.
What we're going to do is arrange it so that any time an edge location in CloudFront tries to look up this hostname, it will receive the IP address of the nearest EC2 instance. (Browsers are automatically routed to the nearest CloudFront edge, so the front-end routing is automatic. We just have to route to the desired back-end).
To do this, create multiple Latency-Based Routing records for this single hostname in Route 53, each one pointing to an EC2 instance (or perhaps an ELB, if you have more than one instance in a given region), and mapped (in the Route 53 configuration) to the region where the EC2 instance is deployed.
Each time a CloudFront edge location needs to do a lookup of the origin server in DNS, the answer it receives will be the instance that is located in the EC2 region that is nearest to the specific CloudFront edge location. (There are more CloudFront locations than there are AWS regions). This instance will be the only one that this particular CloudFront edge will send all of its requests to -- which is what you want -- because client requests will already be sent to the nearest CloudFront edge and each CloudFront edge will now send requests to the EC2 instance in the nearest region.
For regions where you have no instance, provision nothing in Route 53, and one of the existing regions -- whichever is "nearest" to the CloudFront edge -- will be automatically selected. This configuration actually still works even if you only have one region configured in the latency-based routing RR set, because that one region would always be considered the "nearest" to anywhere on the globe, since there's not another to compare against.
Note, of course, that geographic routing is an art as well as a science, so there is no guarantee that the "nearest" CloudFront edge (the one a browser in a particular location connects to) will be the one you necessarily expect, nor would the "nearest" AWS region necessarily be the one you anticipate. This can be either because "nearest" refers to optimal connectivity rather than geographic distance, or because the user hasn't been properly geolocated. This is not a limitation in Route 53 or CloudFront, but rather because IP address-based geolocation with 100% accuracy simply isn't possible. This imprecision needs to be factored into your design, but overall, this is the solution for what you appear to be trying to accomplish.