@samanabo I just noticed that your order of calls looks wrong:
enemySpine.skeletonDataAsset = card.Spine;
..
enemyAnimation.AnimationState.SetAnimation(0, card.DefaultAnimation, true);
..
enemySpine.Initialize(true);
Here calling AnimationState.SetAnimation() before calling SkeletonGraphic.Initialize() is setting the animation of the previous AnimationState which belongs to the previous skeleton (which might not even have an animation named like this), but this AnimationState will be deleted and re-initialized when calling SkeletonGraphic.Initialize()1. So what you should best do instead instead is:
enemyAnimation.AnimationName = null; // clears the initial animation assigned at next Initialize()
enemySpine.Initialize(true); // assigns the initial animation, which is null, not wasting anything
enemyAnimation.AnimationState.SetAnimation(0, card.DefaultAnimation, true); // after Initialize
In the call enemyAnimation.AnimationName = null; you can't assign the future card.DefaultAnimation yet as this would be set as animation of the old skeleton (which might not even have an animation of this name). Setting it to null makes it valid before and during Initialize.
[1] SkeletonGraphic.Initialize() calls SkeletonGraphic.OnRebuild, calling SkeletonAnimation.OnRendererRebuild which then calls SkeletonAnimation.Initialize.