Here's one that I rather like that uses equicontinuity and compactness as the engine for moving from pointwise to uniform convergence. For the sake of clarity, let's recall what equicontinuity means.
Definition: Let $X$ and $Y$ be metric spaces. A set $E$ of continuous functions from $X$ to $Y$ (i.e. $E \subseteq C(X,Y)$ ) is equicontinuous if for every $x \in X$ and every $\varepsilon>0$ there exists $\delta >0$ such that
$$
y \in X \text{ and } d_X(x,y) < \delta \Rightarrow d_Y(f(x),f(y)) < \varepsilon \text{ for all } f \in E.
$$
With this definition in hand, we can state the result.
Theorem: Let $X$ and $Y$ be metric spaces with $X$ compact. Suppose that for $n \in \mathbb{N}$ the function $f_n: X \to Y$ is continuous and that $\{f_n | n \in \mathbb{N}\}$ is equicontinuous. Let $f : X \to Y$ and suppose that $f_n \to f$ pointwise as $n \to \infty$. Then $f_n \to f$ uniformly as $n \to \infty$. In particular, this means that $f$ is continuous.
Proof:
Let $\varepsilon >0$. By the equicontinuity property, for each $x \in X$ we can find $\delta_x >0$ such that
$$
y \in B_X(x,\delta_x) \Rightarrow d_Y(f_n(x),f_n(y)) < \frac{\varepsilon}{4} \text{ for all } n \in \mathbb{N}.
$$
The collection of open balls $\{B_X(x,\delta_x)\}_{x \in X}$ is an open cover of $X$. The compactness of $X$ allows us to find a finite subcover, namely $x_1,\dotsc,x_k \in X$ such that $X = \bigcup_{i=1}^k B_X(x_i,\delta_{x_i})$. Due to the pointwise convergence $f_n \to f$ (or really the pointwise Cauchy property), for each $i=1,\dotsc,k$ we can choose $N_i \in \mathbb{N}$ such that
$$
m,n \ge N_i \Rightarrow d_Y(f_n(x_i),f_m(x_i)) < \frac{\varepsilon}{4}.
$$
Set $N = \max \{N_1,\dotsc,N_m\} \in \mathbb{N}$. For each $x \in X$ there exists $i\in \{1,\dotsc,k\}$ such that $x \in B(x_i,\delta_{x_i})$. Then for $m \ge n \ge N$ we have the estimate
$$
d_Y(f_m(x),f_n(x)) \le d_Y(f_m(x),f_m(x_i)) + d_Y(f_m(x_i),f_n(x_i)) + d_Y(f_n(x_i),f_n(x)) \\
< \frac{\varepsilon}{4} + \frac{\varepsilon}{4} + \frac{\varepsilon}{4} = \frac{3\varepsilon}{4}.
$$
Hence for $n \ge N$,
$$
d_Y(f(x),f_n(x)) = \lim_{m \to \infty} d_Y(f_m(x),f_n(x)) \le \frac{3\varepsilon}{4}.
$$
This holds for all $x \in X$, so
$$
n \ge N \Rightarrow \sup_{x \in X} d_Y(f(x),f_n(x)) \le \frac{3\varepsilon}{4} < \varepsilon,
$$
and we deduce that $f_n \to f$ uniformly as $n \to \infty$.
It is one of the assumptions of Dini's theorem that the limit function $f$ is continuous. You can't use Dini's theorem to show that a monotone limit of continuous functions is continuous, because that is not true.
Counterexample:
$$f_n(x)=\begin{cases}
0 & x\le 0 \\
x^n & 0<x<1\\
1 & x\ge 1
\end{cases}
$$
Best Answer
This proof on $\mathbb{R}$ was given by the solutions manual for Spivak's Calculus, and it follows as such:
First we prove for the case when $f_n$ converges pointwise to $ f(x) = 0$ on $[a, b]$ and $f_n(x) >= f_{n+1}(x)$.
Suppose that $f_n$ doesn't converge to $0$ uniformly, thus for some $\epsilon \gt 0$ there always will be an $ x \in [a, b]$ such that $ f_n(x) \ge \epsilon $ holds for arbitrarily large $n \in \mathbb{N}$. Therefore we can construct a sequence of $n_1 < n_2 < n_3 < \dots $ indices with a corresponding $\{x_n\} $ sequence such that $$ f_{n_i}(x_i) \ge \epsilon \tag{1}$$
Since $\{x_n\}$ sequence is bounded, it has a convergent subsequence $\{ x_{k_n}\} $, and let $ l = \lim_{n \to \infty} x_{k_n}$. $ 0 = f(l) = \lim_{n \to \infty} f_n(l) $, so there will be some $N > 0$ such that $f_n(l) \lt \epsilon $ holds for $n > N$. Furthermore each $f_n$ is continuous, so $f_n(y) < \epsilon$ will hold for all $y$ close enough to $l$, so in particular also for some $x_{k_i}$. By choosing $i$ large enough, $n_{k_i} > n$ also holds, thus $ f_{n_{k_i}}(x_{k_i}) \lt \epsilon$. But this contradicts the choice of $\{x_n\}$ in $(1)$.
Now if $f_n$ converges to some continuous f instead of 0, we can just apply the first part to $f_n - f$.