I'd probably go at it from an algorithm approach. I've always learned as I go, so I like to do practical examples, then loop that back to theory.
So you can start with something simple, like filling the screen with $20 to clear the display. Live code the example, then go back and explain how it works. Right away, explain how you had to set the M flag to 1 to make memory I/O 8 bits, but cleared the X flag to make the index registers 16 bits. This gets the person used to the idea that
Is setting the system up with an 8-bit accumulator and 16-bit index registers.
Likewise, build up good patterns right away, like my "P Last/First" rule (PHP last when entering a subroutine and PLP first, so that the M and X flags are consistent.)
Then in the next lesson, you can take the fill screen example and expand that into a memory copy example.
In the third lesson, you can then take the memory copy example and turn it into a "print a string" example, by adding a BNE to test for a null terminator.
in the next lesson, you can read from the keyboard buffer and print the key on the screen.
Then expand that to use the arrow keys to move a block around on the screen.
The make the block fall and look for something below it.
Then rotate the block.
If you've guessed by now that the viewer will end up with a Tetris game, you get a gold star.