Direct proof that the wedge product preserves integral cohomology classes?
$\def\ZZ{\mathbb{Z}}\def\RR{\mathbb{R}}$I'm not sure if this is an answer to the question, since it does refer to $H_{\ast}(M, \ZZ)$, but I think it sheds some interesting light on why the problem is hard.
We begin with a flawed proof attempt. Write $\delta$ for the diagonal map $M \to M \times M$, and $\pi_1$ and $\pi_2$ for the projections from $M \times M$ onto its first and second factor. Let $\rho$ be an integer $k+\ell$-cycle and let $\alpha$ and $\beta$ be a $k$-form and an $\ell$-form on $M$. Then $\int_{\rho} \alpha \wedge \beta = \int_{\delta(\sigma)} \pi_1^{\ast}(\alpha) \wedge \pi_2^{\ast}(\beta)$. Suppose $\rho$ were homologous in $M \times M$ to $\sum \sigma_i \times \tau_i$, for various cycles $\sigma_i$ and $\tau_i$ in $H_{\ast}(M)$, with $\dim \sigma_i + \dim \tau_i=k+\ell$. Then we would have $$\int_{\rho} \alpha \wedge \beta = \sum \int_{\sigma_i \times \tau_i} \pi_1^{\ast}(\alpha) \wedge \pi_2^{\ast}(\beta) =\sum_{(\dim \sigma_i, \dim \tau_i) = (k, \ell)} \int_{\sigma_i} \alpha \int_{\tau_i} \beta.$$ This would prove the result. (The integrals over terms where $\dim \sigma_i \neq k$ would drop out. If $\dim \sigma_i<k$, then $\pi_1^{\ast}(\alpha)|_{\sigma_i \times \tau_i}=0$ so $\int_{\sigma_i \times \tau_i} \pi_1^{\ast}(\alpha) \wedge \pi_2^{\ast}(\beta)=0$, and likewise if $\dim \tau_i < \ell$.)
Unfortunately, this need not be true. Saying that $\delta(\rho)$ should always be homologous to such a class is saying that $\delta_{\ast} H_m(M)$ should lie in the image of $\bigoplus_{i+j=m} H_i(M, \ZZ) \otimes H_j(M, \ZZ) \to H_{m}(M \times M, \ZZ)$. But the map $\bigoplus_{i+j=m} H_i(M, \ZZ) \otimes H_j(M, \ZZ) \to H_{m}(M \times M, \ZZ)$ need not be surjective -- the cokernel is $\bigoplus_{i+j=m-1} \mathrm{Tor}_1(H_i(M, \ZZ), H_j(M, \ZZ))$ by the Kunneth theorem. There is no reason that $\delta_{\ast}$ needs to land in the image of $\bigoplus H_i \otimes H_j$; I give an example where it doesn't in this Mathoverflow thread,
So we have to work harder. The good news is that the full statement of Kunneth's theorem includes the statement that $$0 \to \bigoplus_{i+j=m} H_i(M, \ZZ) \otimes H_j(M, \ZZ) \to H_{m}(M \times M, \ZZ) \to \bigoplus_{i+j=m-1} \mathrm{Tor}_1(H_i(M, \ZZ), H_j(M, \ZZ)) \to 0$$ is (noncanonically) split. Choose such a splitting $$\iota: \bigoplus_{i+j=m-1} \mathrm{Tor}_1(H_i(M, \ZZ), H_j(M, \ZZ)) \to H_m(M, \ZZ).$$ Then we can write $\delta(\rho) = \sum \sigma_i \times \tau_i + \iota(\sum \phi_j)$ for some $\phi_j$ in Tor groups. But the good news is that Tor groups are torsion, so an integer multiple of $\phi_j$ is homologous to zero. This means that $\int_{\iota(\phi_j)} \pi_1^{\ast}(\alpha) \wedge \pi_2^{\ast}(\beta)$ must be zero. So we still have $\int_{\rho} \alpha \wedge \beta = \sum \int_{\sigma_i \times \tau_i} \pi_1^{\ast}(\alpha) \wedge \pi_2^{\ast}(\beta)$ and now the proof concludes as before. $\square$.
What I find interesting about this argument is two things:
(1) We never had to build cup product in $H^{\ast}(M, \ZZ)$, or prove its compatability with de Rham cohomology, we just tried to shove cycles around naively.
(2) Proving Kunneth with the full statement that the sequence is split is not hard. But I have only ever seen it done in a very algebraic way, not by explicitly writing a cycle on $X \times Y$ as $\sum \sigma_i \times \tau_j + \phi$ for some torsion $\phi$. Moreover, there is no canonical choice of splitting. This may explain why no one seems to be able to prove this in a natural way.
My cohomology is a bit rusty, so I'm sorry for any mistakes or for being sketchy. It may also be that my suggestion is too close to the singular cohomology solution you want to avoid, although I'll be using Cech cohomology instead.
Let's first make a covering $\mathcal{U}=(U_j)_{j\in I}$ of $M$ where all $U_j$, as well as $U_J=\cap_{j\in J} U_j$ for $J\subset I$, are contractible (or empty). The basic idea is to use the double complex $$ \begin{array}{ccccccccc} &&0&\rightarrow&C^0(\mathbb{R})&\rightarrow&C^1(\mathbb{R}) &\rightarrow&\cdots\\ &&\downarrow&&\downarrow&&\downarrow&&\downarrow\\ 0&\rightarrow&\Omega^0&\rightarrow&C^0(\Omega^0)&\rightarrow&C^1(\Omega^0) &\rightarrow&\cdots\\ &&\downarrow&&\downarrow&&\downarrow&&\downarrow\\ 0&\rightarrow&\Omega^1&\rightarrow&C^0(\Omega^1)&\rightarrow&C^1(\Omega^1) &\rightarrow&\cdots\\ &&\downarrow&&\downarrow&&\downarrow&&\downarrow\\ \end{array} $$ where $C^q(\Omega^p)=C^q(\mathcal{U},\Omega^p)$ consists of $(\omega_J)_{J\in I_p}$ where $I_p$ is the set of size $p+1$ subsets of $I$ and $\omega_J\in\Omega^p(U_J)$: i.e. the setup for defining the Cech cohomology. We then have maps $\delta:C^q(\Omega^p)\rightarrow C^{q+1}(\Omega^p)$, and $d:C^q(\Omega^p)\rightarrow C^q(\Omega^q)$.
For convenience, I'll pretend $C^q(\Omega^{-1})=C^q(\mathbb{R})$ and $C^{-1}(\Omega^p)=\Omega^p$ (i.e. global $p$-form which I should probably have denoted $\Gamma(\Omega^p)$ instead of just $\Omega^p$).
Note that $H^p(C^q(\Omega^\bullet))=0$ for $p\ge 0$ since closed forms are exact on all the contractible sets $U_J$.
The proof that $H^k(M)=H^k(\Omega^\bullet)$ is equal to $H^k(M;\mathbb{R})=H^k(C^k(\mathbb{R}))$ is then done by diagram chasing. Start with $\omega\in\Omega^k$ with $d\omega=0$. This maps to $(\omega^{(0)}_J)_{J\in I_0}\in C^0(\Omega^k)$ by restriction of $\omega$ to each $U_J$, $J\in I_0$. Since $d\omega^{(0)}_J=0$, we have $\omega^{(0)}_J=d\upsilon^{(0)}_J$ for some $\upsilon^{(0)}_J\in\Omega^{k-1}(U_J)$. This $(\upsilon^{(0)}_J)$ is then mapped to $\omega^{(1)}\in C^1(\omega^{k-1})$. And so we go, alternatingly moving up and right, until we get an element of $C^k(\mathbb{R})$.
Similar diagram chasing is used to show that this mapping is one-to-one module the images $d\Omega^{k-1}$ and $\delta C^{k-1}(\mathbb{R})$. (Assuming I haven't mixed things up here.)
A $k$-form $\omega$ is integral in $H^k(M)\equiv H^k(M;\mathbb{R})$ if it can be mapped by the above procedure to an element in $C^k(\mathbb{Z})$.
So, here's the trick. Let $\omega$ and $\nu$ be closed $p$- and $q$-forms resp. corresponding to integral cohomology classes. We can then replicate the entire diagram chasing for $\omega$, but apply it to $\omega\wedge\nu$ where through each step we leave $\nu$ unchanged, finally mapping $\omega$ to an element of $\omega^{(-1)}\in C^p(\mathbb{Z})$. This should result in an element of $C^p(\Omega^q)$ where $nu$ restricted to $U_J$ sets are multiplied by the integer values of $\omega^{(q)}_J$.
Afterwards, we continue to do the same with $\nu$: the $\omega^{(p)}=(\omega^{(p)}_J)_{J\in I_p}$ part now consist of just constants by which the forms are multiplied.
As I warned, my cohomoloogy is somewhat rusty, so I may quite likely have missed a number of technical issues. However, I think this basic approach should work. And it should be a good excercise in diagram chasing.