My comments to the main question seemed like they merit a full answer.
If we are talking about introductory level courses then the approach should be naive. It is often all the set theory needed from the working mathematician, and many of my undergrad teachers didn't even know what are the axioms of ZFC (a truth I'd learned during my masters).
It is important to add some logic into the mix, what is a structure and what is an isomorphism of structures. I can give from my own limited experience:
I did my undergrad (and masters) in Ben-Gurion where a course has been tailored not from books, but by collecting pieces of set theory and logic together. I have some disagreements on its current structure, but the idea is that we teach set theory naively from "ZF+The real numbers are atoms" because that's how most people would see mathematics when they approach it naively. I, for example, disagree with the insistence of not mentioning the axiom of choice. In the set theory part we explain what are sets, their basic properties, we teach about induction over $\mathbb N$ and a bit of the theory of partial orders. We also teach the basics of cardinality (as much as you can squeeze from no-choice environment anyway).
We also teach very basic propositional calculus and predicate calculus. Nothing fancy, and we don't talk about proofs and soundness or anything much. We discuss isomorphisms and definability if time permits (e.g. this year) but not always we have this privilege (e.g. last year).
As an intro course I think it is fine, it doesn't go too deep into axioms and what are proofs and so on. Students still don't understand what they need all that for, but the majority of the students are computer science students (the course, however, was designed over 20 years ago when the computer science department was a subset of the math department), and they just want to learn programming and so.
For advanced undergrad courses it is perfectly reasonable to present the full axioms of ZFC and discuss advanced topics like forcing, large cardinals, infinitary combinatorics, and maybe even [very basic] inner model theory.
This, coupled with a course about logic and basic model theory, should give an undergrad an excellent grasp of the basics of set theory.
On the other hand, it is reasonable to suggest a course about categorical foundations in which ETCS and other structural set theories are presented and an algebraic approach to set theory is taken. I don't know what sort of perquisites should be for such course, though. I would expect some category theory at least, in which case it might be suitable as a basic grad-level course rather than an undergrad.
But to repeat what I said at first, for freshmen students (or as a firs course in set theory) the course should be presented in a naive approach, relying on the fact that we all understand what it is to put three files into a folder in the computer, or three books in our bag. Such course should present the basic structure of sets and some basic logic.
If a full year is given, it might be wise to make it into two parts: the first is very naive and basic sets manipulations and basic logic, with the added value of very basic combinatorial results from discrete mathematics course. The second part should focus on slightly more advanced topics such as basic order theory (partial orders and such), cardinals and cardinality, some applications of the axiom of choice, and some more advanced logic (from definability to elementary equivalence, depending on your taste and time limits).