You have $\int |f|^p = \int \liminf_n |f_n|^p \le \liminf_n \int |f_n|^p < \infty$, so $f \in L^p$.
Counterexample for $p=1$:
Let $X=[0,1]$, $f_n=n1_{[0,{1 \over n}]}$, $\|f_n\|_1 = 1$, $f_n(x) \to 0$ ae.,
and let $g=1$. Then
$\int f_n g = 1$ for all $n$, but $\int 0 g = 0$.
Your beginning is good: Show that on step functions, the claim is true, and then try and generalize. Here is probably the simplest way to approximate a generic function with step functions.
First, the monotone convergence theorem will probably be hard to use here, since the $g_n$ are not non-negative functions. So, instead we approach things differently. It is true that step functions are dense in $L^1$: for every $\epsilon > 0$ and $f \in L^1,$ you can find a step function $s$ so that $\int_0^1 |f - s| < \epsilon.$
(Here's one idea on how to do this approximation. First, recall that simple functions are dense in $L^1,$ and so it suffices to argue that the characteristic function of an arbitrary measurable set is well-approximated by a step function. But this is easy, since by definition of the Lebesgue outer measure, we can find a cover of our measurable set by intervals, so that the measure of the interval cover comes arbitrarily close to the measure of our set.)
Anyways, with this approximation in hand, just notice that
$$\int_0^1 |fg_n - sg_n| \leq \int_0^1 |g_n| \cdot |f-s| \leq C\epsilon.$$
Hence, since you've already shown that for all step functions $s,$ the integral $\int_0^1 sg_n \rightarrow 0,$ you can conclude the claim in general (specifically, you can show that the limsup of $\left|\int_0^1 fg_n\right|$ is bounded above by $C\epsilon$ for every $\epsilon > 0,$ so that letting $\epsilon \rightarrow 0$ you recover the desired statement).
This is a fairly common technique for proving identity about $L^p$ or other function spaces: Never ever ever work with an arbitrary function. Instead, prove it for some easy to work with class of functions (for $L^1$ usually step functions or simply functions are a good choice, and for general spaces usually continuous functions with compact support are a good choice), then approximate arbitrary functions by your 'nice' functions. Never work hard! Almost always you can find some large family of functions for which the claim is trivial (like here with step functions), and then use an easy approximation argument.
Best Answer
First consider a bounded measurable function $g$. Then the conclusion follows from the fact that $\int |f_n-f| \to 0$. This well known fact is proved using uniform integrability of the sequence $(f_n)$. [See below for a proof].
The general case is proved easily using Holder's inequlaity: There exist a bounded measurable function $h$ such that $\int |g-h|^{q} <\epsilon$. Note that $|\int f_ng -\int f_nh | \leq \|f_n\|_p \|g-h\|_2 \leq M \|g-h\|_2$ and $|\int fg -\int fh | \leq \|f\|_p \|g-h\|_2 \leq M \|g-h\|_2$.
Let $f_n \to f$ a.e. on $[0,1]$ and assume that $\|f_n\|_p $ is bounded for some $p \in (1,\infty)$. Then $\int |f_n-f| \to 0$.
Proof: It is clearly enough to prove this when $f=0$ (since $\|f\|_p$ is necessarily finite by Fatou's Lemma).
Now $$m\{x: |f_n(x) |>C\}) \leq \frac 1 {C^{p}} \int |f_n|^{p}.$$
From Holder's inequality we get $$\int_{\{x: |f_n(x) |>C\}} |f_n| \leq \|f_n\|_p (m\{x: |f_n(x) |>C\})^{1/q}.$$ It follows that $\int_{\{x: |f_n(x) |>C\}} |f_n|$ can be made less than $\epsilon$ for all $n$ by choosing $C$ large enough. On the other hand $\int_{\{x: |f_n(x) |\leq C\}} |f_n| \to 0$ by DCT.