It's easy to make the case that an LLM 'program' is homoiconic, as the code and the data are all just plain text.
LLMs also offer rich metaprogramming (prompts that write prompts).
They even arguably offer features like CL's condition system.
Of course, they don't operate on symbolic expressions, so it's a stretch to actually call them a lisp (or any other programming language), but they seem to share a lot of the same properties.
Metaprogramming stems from the same thought. You think of an algorithm, discern some part that are contextual, and create an higher level algorithm that takes the context is account. It's not merely creating programs that write programs, it's about solving class of problems instead of a specific instance. For LLMs to fit this pattern, it would be like going from "A prompt that write a specific ffmpeg invocation" to "A prompt that create a prompt to write a specific ffmpeg invocation". I believe classifying problems is more difficult that solving one.
I'm not that familiar with CL's condition system, but from what I know, it works well because the language is evaluation/reduction based instead of stack/heap/counter based like C. This allows discarding branches more easily because there's no mutable memory to alter. Can you discard context that easily in LLMs? I think agents and subagents with IPC would fit that definition more easily.