Before adding each annotation to the map you should check if there is already another annotation at the same place, or within a few meters. If so then combine the data for these annotations into a structure that can keep growing (NSMutableArray is my first guess) and then add that combined data as a new annotation*. Then when the pin is tapped it will ask for the call out details and tell you which annotation was tapped, you can check if the annotation has one datum or multiple data at set up your callout correctly.
You'll need to have a custom annotation class but you would probably have needed that anyway if you're storing useful data about each one.
*you'll also need to ensure the first annotation is not left on the map, so maybe you could do a scan through your data and combine into arrays before doing any annotation stuff. Each annotation would store an array of values, most of them would only have one, but where they are too close together the array would have many values and your callout function would have to display that.