Puff really controls this matchup; it's extremely difficult for Luigi to get in, and once Puff gets him offstage or above him there's very little Luigi can do to reset the situation. Luigi can hit pretty hard, but the opportunities he gets to do so are few unless he's willing to play riskily. Don't be afraid to camp him; you don't have to let him play his game, and you rarely have to commit to much (especially in comparison to what he has to commit to). I'm not sure it's an
awful matchup for Luigi, but it's certainly an awkward one that's going to take a long time if both players are playing it correctly, and it's by no means good for Luigi.
If he's wavedashing back and forth, wait till he wd back to a corner. Then without committing to anything, zone him into that corner.
This is the basic idea; make it hard for him to get in and punish him for trying, then when he retreats, take control of his space and repeat. Maintain your advantageous position and force him to take more risks than you.
One thing I've noticed bout the matchup is that Luigi is incredibly slow in the air. If you're above a Luigi, he shouldnt be able to hit you since you can use your airmobility and jumps to avoid it.
This is technically true if you're really high above him where he can't reach, but that doesn't mean it's a good position; you still have to come down at some point, and he's going to be able to hit you hard when you do. Being above Luigi is a very bad position, since Puff has practically no priority below her, while Luigi has fair and up smash to challenge you with (which are kill moves with good damage, and they maintain Puff's bad positioning when they hit). The strong positions for Puff in this matchup are at tipper bair spacing next to Luigi, or in the air below and slightly beside him.
When next to him, you want to maintain a spacing where you are able to hit him with a bair but are out of range of his standing attacks. Bairing then drifting away is extremely difficult for Luigi to deal with; his wavedash is too slow and his dash-dance too short to be able to move out of range of your bair and then move back in to cover your drift away, and his aerial mobility is low enough that if he isn't already moving towards you then he basically can't hit you with an aerial if you pull away. For Luigi to connect cleanly with an attack in neutral (especially an aerial) he pretty much requires a read, due to Jigglypuff's mobility allowing her to punish reactively while maintaining a safe position and the threat of her crouch when she's on the ground.
Luigi doesn't have grounded options that are particularly effective at hitting an opponent in the air directly in front of him or slightly above him.
• He has forward tilt, but that's not particularly dangerous for anything besides building damage.
• Up smash doesn't hit in front of him and hits inconsistently against grounded small characters like Jigglypuff (even without crouching). It can kill at low damages.
• Down smash doesn't hit unless you're on the ground or close to it. It kills significantly later than up smash.
• Grab loses to aerials and crouching (free rest or up smash). DIing behind Luigi will send you out of range of any direct followups at all but low damages. The only notable DI mixup on throws is between down throw and forward throw (which can combo into wavedash forward tilt if you DI away); it isn't particularly threatening and only works at a pretty limited range of damages anyway (not even at kill damages).
As for aerials:
• Luigi's low aerial mobility means that most of his aerials in neutral are going to be done either out of a long/fast wavedash towards you to compensate for the poor mobility with the velocity from the wavedash, or out of shield (often as a reactive punish for a misspaced aerial or smash attack). Almost any aerial gives you the opportunity to get below him, though with double aerials in play that's not entirely safe when close to the ground.
• Because of how high his short hop goes, if he wants to hit you while you're on the ground then the aerial has to be done at either the very beginning or very end of the jump (otherwise it's going to whiff). If he can get you in shield, then he can mix up double aerial and single aerial to drift away/waveland (along with empty landing and such); though there aren't really many situations where you should be shielding anyway since your aerial mobility usually does a far better job of protecting you.
• If you end up stuck on a platform above him (which isn't somewhere you want to be) then he can force you to shield by sharking below you, making you guess when he's going to throw out an aerial and when you should try to make a move (you can't challenge him from the platform, so you're trying to reset to neutral so you can continue dominating him there).
• Bair is usable for establishing horizontal space (considering it comes somewhat close to being able to challenge Puff's bair).
• Fair and dair work pretty similarly to each other. They hit in front with short range, and will kill.
• Up aerial is useful for hitting you while you're above him and when no other aerial will reach; it doesn't really lead to anything. If Luigi is recovering low then a rising up aerial can clear you off the ledge if you don't have your ledge intangibility for whatever reason. Fair can do the same but doesn't reach as high.
When you're below him and he's in the air above you, his options are poor:
• He can drift to the ground or a platform. He moves too slowly to really bait or mislead you with his movement, so this is usually pretty easy to intercept.
• Jumps without a platform to land on can be followed/intercepted.
• Airdodge has to be used sparingly because of how punishable it is, but it needs to be kept in mind; it's a viable option. Useful because of the intangibility and because it allows him to change his trajectory quickly.
• Aerials, most notably nair and dair. Getting hit by these is bad, but they're easily baited; the Luigi has to throw them out a lot since if he doesn't then you can hit him nearly for free, but all it takes is for you to drift or jump towards him (without needing to commit) to force him to decide whether to throw one out. Dair doesn't last very long at all but will kill the entire time it is active, and nair has tons of active frames followed by tons of endlag but won't kill after the initial part of the move. Both hit below.
When you're at high percentages where Luigi won't mind trading with you (and as a result your zoning becomes much less threatening), you'll be shielding a lot more. Grab isn't too dangerous at kill damages since it doesn't lead to anything directly, but it serves its purpose of scaring you away from just shielding all the time.
You rarely want to Rest unless it's guaraneteed, since it's punishable with up-B (kills very early, deals a solid 25% regardless), and because maintaining your bair zoning works so well that there's no reason to go for risks like that.
The common sense strategy of "getting the opponent offstage, or above you when that's not possible" applies particularly strongly to Luigi.
Edgeguarding is free.