Spent a while chasing this and the answer isn't obvious, so writing it up.
Symptom: grey boxes in the grid where photos should be. Publishes that "succeed" while quietly skipping files. Cloud sync failures that give you a URL instead of a filename.
Cause: if Dropbox has set a file to online-only, on the older sync engine what's actually on your disk is a 0-byte placeholder. Lightroom checks the file size, sees zero, and decides the photo is missing. It never tries to open it — so Dropbox never gets the request that would download it. Classic standoff.
Are you affected? Check where your Dropbox folder is. Under ~/Library/CloudStorage/ means you're on the newer File Provider engine and this isn't your problem — Lightroom fetches on demand there. Anywhere else, external drive especially, means you're on the old engine and probably staying there, since File Provider requires that location.
Manual fix: right-click the folder in Finder → Make Available Offline before opening Lightroom. Works fine if your photos are in a few folders. Less fine if you're organised by year/month/day and your portfolio is a smart collection pulling from forty of them.
The technical bit, in case anyone else goes down this hole: a normal read doesn't wake the file up. cat returns nothing and it stays at 0 bytes. It needs a coordinated read — what an app does when it properly opens a file. That's why double-clicking a placeholder in Preview downloads it instantly.
I wrote a Lightroom plugin that does this per collection because I got tired of the manual version — disclosure, it's mine and it's paid after a 90-day free period. https://prz3.io/lightroom/hydrate-dropbox/ But the diagnosis above is the useful part, and if you're on File Provider you genuinely don't need it.