I initially thought that ZFC was something like a collection of axioms or formation rules, defined in terms of primitive notions, which when successively combined with each other, produced all of the sets that are taken as the ingredients of mathematics. I thought that all mathematical concepts were just names we had given to particular sets generated cumulatively by these axioms, for example, functions were defined as sets of pairs of elements, and the natural numbers the set of all sets generated by recursively taking the power set, starting on the empty set. I had been exploring ways to "interpret" particular classes of sets as things like quantifiers, or the logical connective $\rightarrow$ ('if-then'). Thus, I thought ZFC was like a formal language, which generated a "theory" (the collection of all expressions it generates).
I am now revising my understanding of this in many ways and trying to update my view. First of all, ZFC is a collection of axioms, written in first-order logic. First order logic is defined in terms of primitive notions: constants, variables, functions, predicates, and equality. I would like to consider that it could be possible to enumerate all possible strings of first order logic, but I don't know what further conceptual issues there may be in trying to do so.
This means that the theory generated by ZFC is a subset of the theory generated by first order logic. My guess is that if you find some way to interpret the expressions of first-order logic (a model), you realize that the collection of all possible expressions doesn't have good properties. For example, consider the desire for a theory that does not contain both $\phi$ and $\neg \phi$, "consistency". How can you modify FOL to try to achieve that? You could try to change the formation rules of FOL.
The condition $\forall x (\phi(x) \vee \neg \phi(x))$ is itself a sentence of first-order logic. I am not sure how we can formally "interpret" this as being about expressions in FOL, that is, that variable x can be substituted with expressions from FOL. I am not sure if we should seek a consistent theory by changing the formation rules or imposing conditions on the theory. If we change the formation rules, we may no longer be able to express the concept of "consistency" itself. If we declare that we want to consider expressions meeting a certain condition, how do we stop our formation rules from generating those expressions that we want excluded from our theory?
The von Neumann hierarchy of sets is supposed to generate all pure, well-founded sets, and it only requires the concept of power set and of union. So, I guess ZFC is not an attempt to generate all sets, but to express properties of a collection of sets we would like to have. As I understand it, ZFC does not determine a unique collection of sets or model, but there are actually infinitely many distinct models (How many countable models of ZFC are there?).
If one is to do mathematics rigorously, they would like every concept they mention, such as a function or relation, to have a precise definition. How can we do that with ZFC if ZFC does not determine a unique universe of sets? Is the general idea that one does not enumerate all possible sets, but can prove the existence of a particular set they would like to use, in any model of ZFC?