This is a somewhat soft question, but I thought it worth asking.

Ultraproducts are used to construct exotic models from existing models. We typically finagle things to make them satisfy axioms in a weird way or satisfy weird axioms. Here’s my problem:

What is the general approach to building such models?

I can follow the proofs of ultraproduct constructions just fine. But trying to do them myself, I often find myself at a loss of what to do. For instance, I would be unsure about how I should construct the ultrafilter, what my base models should be, and the use and idea behind these constructions.

I realize this is vague, so to make it slightly more concrete: can someone give me an example of an exotic model they want to create via ultraproduct, and walk me through their thought process in making it; what are you looking for or intending when you define this this way and that that way? Can an analogy be drawn with the compactness theorem? I know that the idea is to try and isolate “generic behavior” of all the models you’re ultraproducting over, but what does that mean in practice?

An problem if you don’t want to make one yourself: there exists a structure $(A, R)$ such that $(A, R) models ZFC-Infinity$ *but* $(A,R)$ is not well founded. How would one construct such a model using the ultraproduct approach? This is a simple enough example I hope. The compactness approach to this certainly is.

Speaking of which; an add-on question: what is the advantage of an ultraproduct construction over using a compactness argument? Why would one do the former when they can do the latter?