I have been thinking recently a lot about this mysterious $CellContext, that turns up when we convert a cell with interactivity (such as Button, Slider, DynamicModule, Dynamic) to a cell expression. Just as Kuba, I found that there is not much documentation on this topic, but in MathGroup and SE there are some very valuable comments and remarks, not in the least from John Fultz.
Here I will try to formulate my ideas how it works. I want to emphasize that I created only a model for Mathematica, based on a lot of testing small examples. Only the developers of Mathematica know if this model describes the reality.
Everything that is seen on the screen is under control of the frontend. When we enter something on the keyboard, the frontend typesets our input in boxes. When we press shift-enter, these boxes are send to the kernel. The kernel uses MakeExpression for making an expression of the input, evaluates that expression, then calls MakeBoxes and sends back the boxes to the frontend. The frontend the displays these boxes, and that is what we see as output. LinkSnooper clearly shows this.
So the kernel only knows about expressions, the frontend only knows about boxes. The frontend cannot know anything about the expressions and variables that were used by the kernel for the construction of the boxes that are sent by the kernel for the output!
A simple example. Evaluate
Slider[0.5]
LinkSnooper shows that BoxData are send to the kernel, and the kernel returns BoxData with a SliderBox with argument 0.5 to the frontend. Then move the slider and convert the output cell to a CellExpression. That is completely done by the frontend; LinkSnooper does not show any traffic between the frontend and the kernel. So the CellExpression is computed by the frontend, using the frontend variable that controls the position of the Slider. Indeed, in the SliderBox we see the current position of the slider. The argument of the SliderBox corresponds to a frontend variable.
It is more general: when we construct a graphical user interface (GUI) with a kernel command GUI[f[x1, ..., xn], the state of this displayed GUI will depend on n state variables, all belonging to the frontend, of which the initial values are given by x1, ..., xn. (Here GUI can be Slider, Button, Dynamic, DynamicModule, ...)
As we have seen already in the slider example, it is important to observe that there is no synchronization between the kernel variable that was used to generate the graphical user interface and the corresponding state variable in the frontend. Synchronization can be established by using the kernel command Dynamic. When a GUI is constructed with a kernel command with a kernel variable wrapped in Dynamic, then this kernel variable and the corresponding state of the GUI are synchronized. And that is the situation when $CellContext variables turn up.
Here I will only look at the example with the slider:
x=0.5; Slider[Dynamic[x]]
Inspect the cell expression. It looks like
Cell[BoxData[
DynamicBox[ToBoxes[
Slider[$CellContext`x], StandardForm],
ImageSizeCache->{300., {12., 21.}}]], "Output"]
Here we see a $CellContext`x variable. It synchronizes the position of the Slider (which belongs to the frontend) with the kernel variable x. The argument of the Slider is the value of the frontend variable controlling the position of the slider. It is replaced here within a DynamicBox with the variable $CellContext`x.
In a DynamicModule we may have $CellContext variables that do not immediately correspond to a kernel variable. Consider the example
DynamicModule[{x = 0}, x = x + 1; Button["x", x = x + 1; Information[x]]]
The CellExpression shows a variable $CellContext`x$$. But when we press the button, we see a kernel variable FE`x$$15 or something like that. This seems to be a particular case of the following:
When with respect to a frontend variable $CellContext`x$$ the frontend has to call the kernel, it will create a special kernel variable FE`x$$nn in the context FE`.
This mechanism is used often for variables in a displayed DynamicModule.
So to summarize: I think that $CellContext variables are very special kernel variables, that only turn up in CellExpressions of displayed GUIs. They always correspond to a frontend variable of the displayed interface, and may or may not immediately be linked to a normal kernel variable. I think that is all. In the documentation, $CellContext is said to be a placeholder. Placeholder for what? I think a placeholder for a frontend variable, anyway not for anything belonging to the kernel.
Any remarks on these ideas are highly appreciated.